package com.cn.conn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * 数据库通用连接类
 * @author Administrator
 *
 */
public class DataManager implements DataManagerimpl {

	
    static DataSource ds = null;

	public DataManager(){		
		try {
			//初始化环境
			Context ctx = new InitialContext(); 
			synchronized (this) {
				if(ds==null){
					//获取数据源
					ds = (DataSource) 
							ctx.lookup("java:/comp/env/jdbc/mycar");			
				}
			}			
			
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取连接
	 */
	@Override
	public Connection getConnection() throws SQLException {		
		return ds.getConnection();
	}

	@Override
	public int updateExecuted(String sql) {
		return this.updateExecuted(sql, null);
	}

	@Override
	public int updateExecuted(String sql, ParamSetimpl params) {
		int row = 0;
		Connection con = null; // 数据库连接对象
		PreparedStatement ps = null;		
		try {
			con = getConnection();
			// 3.执行sql语句
			ps = con.prepareStatement(sql);
			// 设置参数
			if (params != null) {
				// 调用参数设置方法
				params.setParams(ps);
			}
			// 执行SQL
			row = ps.executeUpdate();

		} catch (SQLException e) {
			
			e.printStackTrace();
		} finally {
			// 关闭连接对象
			this.close(con,ps,null);
		}
		return row;
	}

	@Override
	public <T> T query(String sql,RowDatas<T> rd) {
		return query(sql, null, rd);
	}

	@Override
	public <T> T query(String sql, ParamSetimpl params,RowDatas<T> rd) {
		
		List<T> lst = queryList(sql, params, rd);
		if(lst!=null && lst.size()>0){
			return lst.get(0);
		}
		return null;
	}

	@Override
	public <T> List<T> queryList(String sql,RowDatas<T> rd) {		
		
		return queryList(sql, null, rd);
	}

	@Override
	public <T> List<T> queryList(String sql, ParamSetimpl params,RowDatas<T> rd) {
		List<T> lst = new ArrayList<T>();
		Connection con = null; // 数据库连接对象
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			con = getConnection();
			// 3.获取SQL执行对象
			ps = con.prepareStatement(sql);
			// 设置参数
			if (params != null) {
				// 调用参数设置方法
				params.setParams(ps);
			}
			rs = ps.executeQuery();		
			// 4. 处理结果集
			while (rs.next()) {	
				// 将结果集添加到List中
				lst.add(rd.getRowData(rs));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭连接对象
			this.close(con,ps,rs);
		}
		// 返回list集合
		return lst;
	}

	/**
	 * 关闭数据库连接
	 * @param rs 
	 * @param ps 
	 * @param con 
	 */
	public void close(Connection con, PreparedStatement ps, ResultSet rs) {
		// 关闭ResultSet 结果集对象
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		// 关闭PrepareStatement SQL执行对象
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		// 关闭Connection 连接对象
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}
